home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Dialogs / DialogDates.Mod (.txt) < prev    next >
Oberon Text  |  1995-06-30  |  5KB  |  147 lines

  1. Syntax10.Scn.Fnt
  2. Syntax10i.Scn.Fnt
  3. StampElems
  4. Alloc
  5. 16 Dec 94
  6. Syntax10b.Scn.Fnt
  7. MODULE DialogDates;
  8.     (** Markus Knasm
  9. ller 12 Sep 94 - 
  10.     (* This sourcecode uses parts of ClockElems - gri 18.3.91 & StampElems - CAS 26.6.92 *)
  11.     IMPORT DialogFrames, Dialogs, DialogTexts, Oberon, Display, Fonts, GraphicUtils, In, Input, TextFrames, Texts, Viewers;
  12.     CONST
  13.         W* = 60; H* = 20; MM = 1;
  14.         ticks = 300; (* Oberon.Time ticks per second*)
  15.     TYPE
  16.         Item* = POINTER TO ItemDesc;
  17.         ItemDesc* = RECORD(Dialogs.ObjectDesc)
  18.         END;
  19.         Time = RECORD timeStamp, dateStamp: LONGINT END;
  20.         NotifyMsg = RECORD(Display.FrameMsg) new: Time END;
  21.         wakeUp: LONGINT; (* overflow in 82.8 days *)
  22.         old: Time; (* displayed Time *)    
  23.         fnt: Fonts.Font;
  24.         Task: Oberon.Task;
  25.         month: ARRAY 12*3+1 OF CHAR;
  26.     PROCEDURE Format (date: LONGINT; VAR s: ARRAY OF CHAR);
  27.         VAR i: INTEGER;
  28.         PROCEDURE Pair (x: LONGINT);
  29.         BEGIN
  30.             IF x >= 10 THEN s[i] := CHR(x DIV 10 + 30H); INC(i) END;
  31.             s[i] := CHR(x MOD 10 + 30H); INC(i)
  32.         END Pair;
  33.         PROCEDURE Label (m: LONGINT);
  34.         BEGIN 
  35.             m := (m-1)*3;
  36.             s[i] := month[m]; s[i+1] := month[m+1]; s[i+2] := month[m+2]; INC(i, 3)
  37.         END Label;
  38.     BEGIN 
  39.         i := 0;
  40.         Pair(date MOD 32); s[i] := " "; INC(i);
  41.         Label(date DIV 32 MOD 16); s[i] := " "; INC(i);
  42.         Pair(date DIV 512 MOD 128); s[i] := 0X
  43.     END Format;
  44.     PROCEDURE (c: Item) Draw* (x, y: INTEGER; f: Display.Frame);
  45.     (** displays the object at (x, y) in frame f *)
  46.         VAR mode, w, h, ox, oy, cx, yh: INTEGER; str: ARRAY 12 OF CHAR; time: Time;
  47.     BEGIN
  48.         c.GetDim (ox, oy, w, h);
  49.         IF c.selected THEN mode := Display.invert ELSE mode := Display.paint END;
  50.         yh := y + (h DIV 2) - ((fnt.minY + fnt.maxY) DIV 2);
  51.         Oberon.GetClock (time.timeStamp, time.dateStamp);
  52.         Format (time.dateStamp, str);
  53.         IF h - (yh - y) > fnt.maxY THEN
  54.             GraphicUtils.DrawString (f, str, x + 3, yh, w - 4, fnt, mode, GraphicUtils.center, cx)
  55.         END
  56.     END Draw;
  57.     PROCEDURE (c: Item) Print* (x, y: INTEGER);
  58.     (** prints the object at printer coordinates (x, y)  *)
  59.         VAR w, h, ox, oy, yh: INTEGER; fnth: LONGINT; time: Time; str: ARRAY 12 OF CHAR;
  60.     BEGIN
  61.         c.GetPDim (ox, oy, w, h);
  62.         fnth := ((fnt.maxY - fnt.minY) * Dialogs.dUnit) DIV Dialogs.pUnit DIV 2;
  63.         yh := y + (h DIV 2) - SHORT (fnth); 
  64.         Oberon.GetClock (time.timeStamp, time.dateStamp);
  65.         Format (time.dateStamp,str);
  66.         IF h - (yh - y) > ((fnt.maxY * SHORT (Dialogs.dUnit)) DIV Dialogs.pUnit) THEN 
  67.             GraphicUtils.PrintString (str, x + 3, yh, w- 4, fnt, GraphicUtils.center, ox) 
  68.         END
  69.     END Print;
  70.     PROCEDURE (c: Item) Copy* (VAR dup: Dialogs.Object);
  71.     (** allocates dup and makes a deep copy of o. Before calling this methode dup should be equal NIL *)
  72.         VAR x: Item;
  73.     BEGIN
  74.         IF dup = NIL THEN NEW (x); dup := x ELSE x := dup(Item) END;
  75.         c.Copy^ (dup);
  76.     END Copy;
  77.     PROCEDURE (c: Item) Track (x, y: INTEGER; keys: SET; f: Display.Frame; p: Dialogs.Panel);
  78.         VAR keysum: SET; t: Texts.Text;
  79.     BEGIN
  80.         IF keys = {MM} THEN 
  81.             keysum := keys;
  82.             REPEAT 
  83.                 Input.Mouse(keys, x, y); keysum := keysum + keys;
  84.                 Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y)
  85.             UNTIL keys = {};
  86.             IF (keysum = {MM}) & (c.cmd[0] # 0X) THEN 
  87.                 DialogTexts.GetParText (c.par, c.panel, t);
  88.                 c.CallCmd (f, Viewers.This (x, y), t)
  89.             END
  90.         ELSE Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, x, y)
  91.         END
  92.     END Track;
  93.     PROCEDURE (c: Item) Handle* (f: Display.Frame; VAR m: Display.FrameMsg);
  94.     (** handles messages which were sent to frame f *)
  95.     BEGIN
  96.         c.Handle^ (f, m);
  97.         WITH f: DialogFrames.Frame DO
  98.             WITH m: Oberon.InputMsg DO
  99.                 IF m.id = Oberon.track THEN c.Track (m.X, m.Y, m.keys, f, f.panel) END
  100.             | m: NotifyMsg DO
  101.                 c.Hide; c.Restore
  102.             ELSE
  103.             END
  104.         ELSE
  105.         END
  106.     END Handle;
  107.     PROCEDURE Clock;
  108.         VAR msg: NotifyMsg;
  109.     BEGIN
  110.         IF Oberon.Time () >= wakeUp THEN 
  111.             Oberon.GetClock (msg.new.timeStamp, msg.new.dateStamp);
  112.             IF msg.new.dateStamp # old.dateStamp THEN 
  113.                 wakeUp := Oberon.Time () + ticks * 15 DIV 16;
  114.                 Viewers.Broadcast (msg); old := msg.new
  115.             ELSE
  116.                 wakeUp := Oberon.Time () + ticks DIV 16
  117.             END
  118.         END
  119.     END Clock;
  120.     PROCEDURE Insert*;
  121.     (** Insert ([name] [x y w h] | ^ ) inserts a date - item in the panel containing the caret position *)
  122.         VAR x, y, x1, y1, w, h: INTEGER; b: Item; p: Dialogs.Panel; name: ARRAY 64 OF CHAR; 
  123.     BEGIN 
  124.         NEW (b);  
  125.         DialogFrames.GetCaretPosition (p, x, y);
  126.         IF (p # NIL) THEN 
  127.             b.Init; In.Open; In.Name (name);
  128.             IF ~In.Done THEN COPY ("", name); In.Open END;
  129.             b.SetName (name); 
  130.             In.Int (x1); In.Int (y1); In.Int (w); In.Int (h);
  131.             IF ~In.Done THEN x1 := x; y1 := y; w := W; h := H 
  132.             ELSE
  133.                 IF w < 0 THEN w := W END;
  134.                 IF h < 0 THEN h := H END
  135.             END;
  136.             b.SetDim (x1, y1, w, h, FALSE); p.Insert (b, FALSE) 
  137.         ELSE
  138.             Dialogs.res := Dialogs.noPanelSelected
  139.         END;
  140.         IF Dialogs.res # 0 THEN Dialogs.Error ("DialogDates") END;
  141.     END Insert;
  142. BEGIN
  143.     Oberon.GetClock (old.timeStamp, old.dateStamp); fnt := Fonts.This ("Syntax10.Scn.Fnt");
  144.     NEW (Task); Task.safe := FALSE; Task.handle := Clock; Oberon.Install (Task);
  145.     month := "JanFebMarAprMayJunJulAugSepOctNovDec"        
  146. END DialogDates.
  147.